package com.xbongbong.pay.platform.wechatpay.pojo.request;

import com.alibaba.fastjson.annotation.JSONField;
import lombok.Getter;
import lombok.Setter;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;

/**
 * 申请退款
 * @author 魏荣杰
 * @date 2021/2/2 15:44
 * @since
 * @version
 */
@Setter
@Getter
public class WeChatApplyRefundRequest extends WeChatBaseRequest{
    private static final long serialVersionUID = -5328787888088554781L;

    /**
     * 原支付交易对应的微信订单号。
     * 示例值：1217752501201407033233368018
     */
    @Size(min = 1, max = 32)
    @JSONField(name = "transaction_id")
    private String transactionId;

    /**
     * 原支付交易对应的商户订单号。
     * 示例值：1217752501201407033233368018
     */
    @Size(min = 1, max = 32)
    @JSONField(name = "out_trade_no")
    private String outTradeNo;

    /**
     * 商户系统内部的退款单号，商户系统内部唯一，只能是数字、大小写字母_-|*@ ，同一退款单号多次请求只退一笔。
     * 示例值：1217752501201407033233368018
     */
    @NotNull
    @Size(min = 1, max = 64)
    @JSONField(name = "out_refund_no")
    private String outRefundNo;

    /**
     * 若商户传入，会在下发给用户的退款消息中体现退款原因。
     * 示例值：商品已售完
     */
    @Size(min = 1, max = 80)
    private String reason;

    /**
     * 异步接收微信支付退款结果通知的回调地址，通知url必须为外网可访问的url，不能携带参数。 如果参数中传了notify_url，则商户平台上配置的回调地址将不会生效，优先回调当前传的这个地址。
     * 示例值：https://weixin.qq.com
     */
    @Size(min = 1, max = 16)
    @JSONField(name = "notify_url")
    private String notifyUrl;
    /**
     * 若传递此参数则使用对应的资金账户退款，否则默认使用未结算资金退款（仅对老资金流商户适用）。
     * 枚举值：
     * AVAILABLE：可用余额账户
     * 示例值：AVAILABLE
     */
    @Size(min = 1, max = 16)
    @JSONField(name = "funds_account")
    private String fundsAccount;

    /**
     * 订单金额信息。
     */
    @NotNull
    @Valid
    private Amount amount;

    /**
     * 指定商品退款需要传此参数，其他场景无需传递。
     */
    @JSONField(name = "goods_detail")
    @Valid
    private List<GoodsDetail> goodsDetail;

    @Setter
    @Getter
    public static class Amount {
        /**
         * 退款金额，币种的最小单位，只能为整数，不能超过原订单支付金额。
         * 示例值：888
         */
        @NotNull
        private Integer refund;
        /**
         * 原支付交易的订单总金额，币种的最小单位，只能为整数。
         * 示例值：888
         */
        @NotNull
        private Integer total;
        /**
         * 符合ISO 4217标准的三位字母代码，目前只支持人民币：CNY。
         * 示例值：CNY
         */
        @NotNull
        private String currency;
    }


    @Setter
    @Getter
    public static class GoodsDetail {
        /**
         * 由半角的大小写字母、数字、中划线、下划线中的一种或几种组成。
         * 示例值：1217752501201407033233368018
         */
        @NotNull
        @Size(min = 1, max = 32)
        @JSONField(name = "merchant_goods_id")
        private String merchantGoodsId;
        /**
         * 微信支付定义的统一商品编号（没有可不传）。
         * 示例值：1001
         */
        @Size(min = 1, max = 32)
        @JSONField(name = "wechatpay_goods_id")
        private String wechatpayGoodsId;
        /**
         * 商品的实际名称。
         * 示例值：iPhone6s 16G
         */
        @Size(min = 1, max = 256)
        @JSONField(name = "goods_name")
        private String goodsName;
        /**
         * 商品单价金额，单位为分。
         * 示例值：528800
         */
        @NotNull
        @JSONField(name = "unit_price")
        private Integer unitPrice;
        /**
         * 商品退款金额，单位为分。
         * 示例值：528800
         */
        @NotNull
        @JSONField(name = "refund_amount")
        private Integer refundAmount;
        /**
         * 单品的退款数量。
         * 示例值：1
         */
        @NotNull
        @JSONField(name = "refund_quantity")
        private Integer refundQuantity;
    }
}
